/**
  * <br>JAVACC DEMO 1.0<br>
  * @copy right ius company All rights reserved.<br>
  * <br>
  * @Package com.apache.exception
*/
package com.apache.exception;

/**
  * description: Exception基类
  * @author Hou DaYu 创建时间：下午03:33:51
  */
@SuppressWarnings("serial")
public class BaseException extends RuntimeException {

	protected String expressionString;
	protected int position;

	/**
	 * 创建一个新的异常。
	 * @param expressionString 该异常字符串
	 * @param message 一个描述消息
	 */
	public BaseException(String expressionString, String message) {
		super(message);
		this.position = -1;
		this.expressionString = expressionString;
	}

	/**
	 * 创建一个新的异常。
	 * @param expressionString 该异常字符串
	 * @param position 在出现问题的表达式字符串的位置
	 * @param message 一个描述消息
	 */
	public BaseException(String expressionString, int position, String message) {
		super(message);
		this.position = position;
		this.expressionString = expressionString;
	}

	/**
	 * 创建一个新的异常。
	 * @param 在出现问题的表达式字符串的位置
	 * @param 一个描述消息
	 */
	public BaseException(int position, String message) {
		super(message);
		this.position = position;
	}

	/**
	 * 创建一个新的异常。
	 * @param position 在出现问题的表达式字符串的位置
	 * @param message 一个描述消息
	 * @param cause 异常的根本原因
	 */
	public BaseException(int position, String message, Throwable cause) {
		super(message, cause);
		this.position = position;
	}

	/**
	 * 创建一个新的异常。
	 * @param message 一个描述消息
	 */
	public BaseException(String message) {
		super(message);
	}

	public BaseException(String message, Throwable cause) {
		super(message, cause);
	}

	public String toDetailedString() {
		StringBuilder output = new StringBuilder();
		if (expressionString != null) {
			output.append("Expression '");
			output.append(expressionString);
			output.append("'");
			if (position != -1) {
				output.append(" @ ");
				output.append(position);
			}
			output.append(": ");
		}
		output.append(super.getMessage());
		return output.toString();
	}

	public final String getExpressionString() {
		return this.expressionString;
	}

	public final int getPosition() {
		return position;
	}

	public String getMessage() {
		return buildMessage(super.getMessage(), getCause());
	}

	private String buildMessage(String message, Throwable cause) {
		if (cause != null) {
			StringBuilder sb = new StringBuilder();
			if (message != null) {
				sb.append(message).append("; ");
			}
			sb.append("nested exception is ").append(cause);
			return sb.toString();
		} else {
			return message;
		}
	}
}
